
package carmadness.model;

import java.util.List;
import java.util.LinkedList;

/**
 * Útszegmenst csomagoló osztály. A kapcsolódási irányok egyértelmű azonosítása
 * és kezelése miatt szükséges csomagolni minden útszegmenst (összesen kétszer,
 * egyszer a befelé jövő, egyszer a kifelé menő irányban).
 * 
 * @author Ujhelyi
 * @version 1.0
 * @created 10-Apr-2010 2:32:42 PM
 */
abstract public class RoadSegmentWrapper extends GameObject
{
	/**
	 * Megmondja, hogy az adott kapcsolódás milyen irányban áll.
	 */
	protected float angle;
	/**
	 * Az RSW által tartalmazott Rule-ok listája.
	 */
	private List<Rule> rules = new LinkedList<Rule>();
	/**
	 * A csomagolt útelem.
	 */
	protected RoadSegment segment;
	/**
	 * A szabálylistában lévő SpeedLimit-re mutató referencia.
	 */
	private SpeedLimit speedLimit;

	public RoadSegmentWrapper( RoadSegment segment, float angle )
	{
		this.segment = segment;
		this.angle = angle;

		speedLimit = new SpeedLimit();
		rules.add( speedLimit );
	}

	/**
	 * Visszaadja a kapcsolódási irányt.
	 */
	public float getAngle()
	{
		return angle;
	}

	/**
	 * Visszatér a belépéshez szükséges minimális súllyal.
	 * 
	 * @return Belépési súly.
	 */
	abstract public float getEntryWeight();

	/**
	 * Visszaadja a csomagolt útelemet.
	 * 
	 * @return A csomagolt útelem.
	 */
	public RoadSegment getRS()
	{
		return segment;
	}

	/**
	 * Visszatér a szabályok listájával.
	 * 
	 * @return A szabályok listája.
	 */
	public List<Rule> getRules()
	{
		speedLimit.setValue( segment.getSpeedLimit().getValue() );

		return rules;
	}

	/**
	 * Az útelem csomagoló csak akkor változik, ha a rajta lévő szabályok
	 * valamelyike változott.
	 */
	@Override
	public boolean hasChanged()
	{
		for ( Rule r : this.rules )
		{
			if ( r.hasChanged() ) return true;
		}
		return false;
	}

	/**
	 * Visszatér a csomagolt útelement lévő jármű közlekedési súlyával.
	 * 
	 * @return A jármű közlekedési súlya.
	 */
	abstract public float getTrafficWeight();
}
